package com.warm.base.design.c_builder;

/**
 * @Date: 2019/11/21 15:40
 * @Author: LChuang
 * @Description: 建造者模式(生成器模式)(创建型)
 *
 *     将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。
 */
public class Client {

    /**
     * builder: 抽象建造者, 描述具体建造者的公共接口，一般用来定义建造细节的方法，并不涉及具体的对象部件的创建。
     *
     * ConcreteBuilder: 具体建造者, 描述具体建造者，并实现抽象建造者公共接口。
     *
     * Director: 指挥者, 调用具体建造者来创建复杂对象（产品）的各个部分，并按照一定顺序（流程）来建造复杂对象。
     *
     * Product: 产品, 描述一个由一系列部件组成较为复杂的对象
     */
    public static void main(String[] args) {
        // 通过Client、Director、Builder和Product形成的建造者模式
        Director director = new Director();
        Product product = director.create(new ConcreteBuilder());
        System.out.println(product.toString());

        // 通过静态内部类方式实现零件无序装配话构造
        /**
         * 主要角色: 抽象建造者、具体建造者、产品
         * 指挥者交给用户来操作，使得产品的创建更加简单灵活
         */
        ConcreteBuilder concreteBuilder = new ConcreteBuilder();
        concreteBuilder.buildA();
        concreteBuilder.buildB();
        Product product1 = concreteBuilder.getProduct();
        System.out.println(product1.toString());
    }
}
